package com.atguigu.gmall.cart.service.impl;

import com.atguigu.gmall.cart.mapper.CartInfoMapper;
import com.atguigu.gmall.cart.service.CartInfoAsyncService;
import com.atguigu.gmall.cart.service.CartInfoService;
import com.atguigu.gmall.common.constant.RedisConst;
import com.atguigu.gmall.model.cart.CartInfo;
import com.atguigu.gmall.model.product.SkuInfo;
import com.atguigu.gmall.product.client.ProductFeignClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.concurrent.CompletableFuture;

@Service
public class CartInfoServiceImpl implements CartInfoService {
    @Autowired
    private RedisTemplate redisTemplate;


    @Autowired
    private CartInfoAsyncService cartInfoAsyncService;
    @Autowired
    private ProductFeignClient productFeignClient;


    //加入购物车
    @Override
    public CartInfo addCart(Long skuId, Integer skuNum) {
        //真实用户或临时用户ID
        String userId = "3";

        //1:Redis  同步  五大数据类型   String类型 值类型  token userId
        //Hash类型  散列类型
        //参数1:   h   Map   h  = new  HashMap();  用户ID
        //参数1:   hk    h.put(k,                  skuId
        //参数1:   hv    h.put(k.v);               CartInfo

        String cacheH = RedisConst.USER_KEY_PREFIX + userId + RedisConst.USER_CART_KEY_SUFFIX;
        String cacheHk = skuId.toString();
        //1.1 查询 Redis还是 DB
        CartInfo cartInfo = (CartInfo) redisTemplate.opsForHash().get(cacheH, cacheHk);
        if (null != cartInfo) {
            //缓存中已经存在了  追加数量
            cartInfo.setSkuNum(cartInfo.getSkuNum() + skuNum);
            //选中
            cartInfo.setIsChecked(1);
            //2:Mysql  异步  保存购物车信息 （备份）
            cartInfoAsyncService.updateByIdAsync(cartInfo);//报错  没有主键

        } else {
            //直接作为新商品  添加
            cartInfo = new CartInfo();
            //商品ID
            cartInfo.setSkuId(skuId);
            //商品数量
            cartInfo.setSkuNum(skuNum);
            //库存信息对象
            SkuInfo skuInfo = productFeignClient.getSkuInfo(skuId);
            cartInfo.setUserId(userId);
            //购物车价格
            cartInfo.setCartPrice(skuInfo.getPrice());
            //图片
            cartInfo.setImgUrl(skuInfo.getSkuDefaultImg());
            //名称
            cartInfo.setSkuName(skuInfo.getSkuName());
            //实时价格
            cartInfo.setSkuPrice(skuInfo.getPrice());
            //2:Mysql  异步  保存购物车信息 （备份）
            cartInfoAsyncService.insertAsync(cartInfo);//子线程
        }
        //保存缓存中
        redisTemplate.opsForHash().put(cacheH, cacheHk, cartInfo);
        // 要 设置过期时间     本次不设置了


        return cartInfo;
    }

    //查询新添加的购物车商品
    @Override
    public CartInfo toCart(Long skuId) {
        //真实用户或临时用户ID
        String userId = "3";
        String cacheH = RedisConst.USER_KEY_PREFIX + userId + RedisConst.USER_CART_KEY_SUFFIX;
        String cacheHk = skuId.toString();
        return (CartInfo) redisTemplate.opsForHash().get(cacheH,cacheHk);
    }


    //去购物车结算  在次查询实时价格   页面回显的时候  价格就正确了
}
